home *** CD-ROM | disk | FTP | other *** search
/ Delphi Informant Complete 1995 - 2000 / Delphi Informant Complete 1995 to 2000.iso / Delphi Informant Magazine Complete Works SOURCE CODE 1998.rar / 1998 / Jan / di9801rs / Sorter.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1997-08-20  |  5.6 KB  |  227 lines

  1. unit Sorter;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   Menus, StdCtrls, ExtCtrls,
  8.   SortAlgs;
  9.  
  10. type
  11.   TSortForm = class(TForm)
  12.     Label3: TLabel;
  13.     NumRepsText: TEdit;
  14.     AlgorithmGroup: TRadioGroup;
  15.     Label5: TLabel;
  16.     Panel1: TPanel;
  17.     TimeLabel: TLabel;
  18.     CmdSort: TButton;
  19.     GroupBox1: TGroupBox;
  20.     Label1: TLabel;
  21.     Label2: TLabel;
  22.     Label4: TLabel;
  23.     MaxValueText: TEdit;
  24.     NumItemsText: TEdit;
  25.     SortedCheck: TCheckBox;
  26.     NumUnsortedText: TEdit;
  27.     CmdBuildList: TButton;
  28.     procedure CmdSortClick(Sender: TObject);
  29.     procedure CmdBuildListClick(Sender: TObject);
  30.     procedure FormCreate(Sender: TObject);
  31.     procedure SortItems;
  32.     procedure CheckSort;
  33.     procedure DisableCmdSort(Sender: TObject);
  34.   private
  35.     { Private declarations }
  36.   public
  37.     { Public declarations }
  38.   end;
  39.  
  40. var
  41.     SortForm: TSortForm;
  42.  
  43. implementation
  44.  
  45. {$R *.DFM}
  46. const
  47.     AlgBubbleSort    = 0;
  48.     AlgSelectionSort = 1;
  49.     AlgQuicksort     = 2;
  50.     AlgCountingsort  = 3;
  51.  
  52. type
  53.     ValueType = Longint; // Type used in the arrays.
  54.     IndexType = Longint; // Type used to index arrays.
  55.     TValueArray = array[0..100000000] of ValueType;
  56.     PValueArray = ^TValueArray;
  57.  
  58. var
  59.     List, SortedList                : PValueArray;
  60.     NumItems, MaxValue, NumUnsorted : IndexType;
  61.  
  62. // Sort the list items.
  63. procedure TSortForm.SortItems;
  64. var
  65.     start_time, stop_time, ellapsed_time : TDateTime;
  66.     i                                    : IndexType;
  67.     num_reps, rep                        : Integer;
  68.     hr, min, sec, msec                   : Word;
  69.     secs                                 : Double;
  70. begin
  71.     TimeLabel.Caption := '';
  72.  
  73.     // See how many repetitions to perform.
  74.     try
  75.         num_reps := StrToInt(NumRepsText.Text);
  76.     except
  77.         NumRepsText.Text := '1';
  78.         num_reps := 1;
  79.     end;
  80.  
  81.     ellapsed_time := 0;
  82.     for rep := 1 to num_reps do
  83.     begin
  84.         // Copy the list into the SortedList array.
  85.         for i := 1 to NumItems do
  86.         begin
  87.             SortedList^[i] := List^[i];
  88.         end;
  89.  
  90.         start_time := Time;
  91.         case AlgorithmGroup.ItemIndex of
  92.             AlgBubbleSort:    Bubblesort(SortedList^, 1, NumItems);
  93.             AlgSelectionSort: Selectionsort(SortedList^, 1, NumItems);
  94.             AlgQuicksort:     Quicksort(SortedList^, 1, NumItems);
  95.             AlgCountingsort:  Countingsort(List^, SortedList^, 1, NumItems, 1, MaxValue);
  96.         end;
  97.         stop_time := Time;
  98.         ellapsed_time :=
  99.             ellapsed_time + stop_time - start_time;
  100.     end;    // for rep := 1 to num_reps do
  101.  
  102.     DecodeTime(ellapsed_time, hr, min, sec, msec);
  103.     secs := sec + msec / 1000;
  104.     TimeLabel.Caption := Format('%.2f', [secs]);
  105. end;
  106.  
  107. // Verify the sort's correctness.
  108. procedure TSortForm.CheckSort;
  109. var
  110.     i : IndexType;
  111. begin
  112.  
  113.     for i := 2 to NumItems do
  114.     begin
  115.         if (SortedList^[i - 1] > SortedList^[i]) Then
  116.         begin
  117.             Beep;
  118.             ShowMessage(Format(
  119.                 'SortedList[%d] = %d, SortedList[%d] = %d',
  120.                 [i - 1, SortedList^[i - 1],
  121.                  i, SortedList^[i]]));
  122.             Exit;
  123.         end;
  124.     end;
  125. end;
  126.  
  127. procedure TSortForm.CmdSortClick(Sender: TObject);
  128. begin
  129.     // Display the hourglass cursor.
  130.     Screen.Cursor := crHourGlass;
  131.  
  132.     // Sort the list.
  133.     SortItems;
  134.  
  135.     // Verify the sort's correctness.
  136.     CheckSort;
  137.  
  138.     // Remove the hourglass cursor.
  139.     Screen.Cursor := crDefault;
  140. end;
  141.  
  142. procedure TSortForm.CmdBuildListClick(Sender: TObject);
  143. var
  144.     i, j, k : IndexType;
  145.     temp    : ValueType;
  146. begin
  147.     // Display the hourglass cursor.
  148.     Screen.Cursor := crHourGlass;
  149.  
  150.     // Read the test parameters.
  151.     try
  152.         NumItems := StrToInt(NumItemsText.Text);
  153.     except
  154.         NumItemsText.Text := '1000';
  155.         NumItems := 1000;
  156.     end;
  157.     try
  158.         MaxValue := StrToInt(MaxValueText.Text);
  159.     except
  160.         MaxValueText.Text := '10000';
  161.         MaxValue := 10000;
  162.     end;
  163.  
  164.     if (SortedCheck.Checked) then
  165.     begin
  166.         try
  167.             NumUnsorted := StrToInt(NumUnsortedText.Text);
  168.         except
  169.             NumUnsortedText.Text := '1';
  170.             NumUnsorted := 1;
  171.         end;
  172.     end;
  173.  
  174.     // Free previously allocated memory.
  175.     FreeMem(List);
  176.     FreeMem(SortedList);
  177.  
  178.     // Allocate room for the lists.
  179.     GetMem(List, (NumItems + 1) * SizeOf(ValueType));
  180.     GetMem(SortedList, (NumItems + 1) * SizeOf(ValueType));
  181.  
  182.     // Initialize the list randomly.
  183.     for i := 1 to NumItems do
  184.         List^[i] := Trunc(Random(MaxValue)) + 1;
  185.  
  186.     // Sort the list if necessary.
  187.     if (SortedCheck.Checked) then
  188.     begin
  189.         // Sort the list.
  190.         Quicksort(List^, 1, NumItems);
  191.  
  192.         // Swap items to put NumUnsorted
  193.         // items out of order.
  194.         for i := 1 to NumUnsorted Div 2 do
  195.         begin
  196.             j := Trunc(Random(NumItems)) + 1;
  197.             k := Trunc(Random(NumItems)) + 1;
  198.             temp := List^[j];
  199.             List^[j] := List^[k];
  200.             List^[k] := temp;
  201.         end;
  202.     end;
  203.  
  204.     // Enable the Sort button.
  205.     CmdSort.Enabled := True;
  206.  
  207.     // Remove the hourglass cursor.
  208.     Screen.Cursor := crDefault;
  209. end;
  210.  
  211. procedure TSortForm.FormCreate(Sender: TObject);
  212. begin
  213.     Randomize;
  214.  
  215.     // Allocate some space to free later.
  216.     GetMem(List, SizeOf(ValueType));
  217.     GetMem(SortedList, SizeOf(ValueType));
  218. end;
  219.  
  220. procedure TSortForm.DisableCmdSort(Sender: TObject);
  221. begin
  222.    CmdSort.Enabled := False;
  223. end;
  224.  
  225.  
  226. end.
  227.